package com.sky.service.common;

import com.sky.dto.*;
import com.sky.pojo.Courier;
import com.sky.pojo.Orders;
import com.sky.result.PageResult;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderSubmitVO;
import com.sky.vo.OrderVO;

/**
 * 订单业务接口
 * @author zgp
 * @version V1.0
 * @date 2025-01-28 11:36
 */
public interface OrderService {
    /**
     * 获取订单预计送达时间
     * @param shopId 店铺id
     * @param customerAddress 送货地址
     * @return 预计送达时间
     */
    String getOrderEstimatedDeliveryTime(Long shopId, String customerAddress);

    /**
     * 订单提交
     * @param ordersSubmitDTO 订单DTO
     * @return 订单VO
     */
    OrderSubmitVO submitOrders(OrdersSubmitDTO ordersSubmitDTO);

    /**
     * 根据订单编号修改订单信息
     * @param orders 订单信息
     */
    void updateByOrderNumber(Orders orders);

    /**
     * 用户催单
     * @param id 订单id
     */
    void reminder(Long id);

    /**
     * 查询当前用户历史订单
     * @param ordersPageQueryDTO 查询参数
     * @return 分页订单数据
     */
    PageResult<Orders> getUserHistoryOrders(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 查询当前用户历史退款订单
     * @param ordersPageQueryDTO ordersPageQueryDTO 查询参数
     * @return 分页订单数据
     */
    PageResult<Orders> getUserRefundOrders(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 根据id查询订单详情
     * @param id 订单id
     * @return 订单
     */
    Orders getOrdersDetail(Long id);

    /**
     * 再来一单
     * @param id 订单id
     */
    void repetitionBuyOrders(Long id);

    /**
     * 取消订单
     * @param ordersCancelDTO 待取消订单实体
     */
    void cancelOrders(OrdersCancelDTO ordersCancelDTO);

    /**
     * 条件分页查询订单
     * @param ordersPageQueryDTO 查询参数实体DTO
     * @return 分页订单实体
     */
    PageResult<OrderVO> conditionSearchOrders(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 统计各状态订单的数量
     * @return 实体VO
     */
    OrderStatisticsVO orderStatistics();

    /**
     * 拒单操作
     * @param ordersRejectionDTO 拒单参数实体
     */
    void rejectionOrder(OrdersRejectionDTO ordersRejectionDTO);

    /**
     * 商家接单操作
     * @param ordersConfirmDTO 接单操作订单DTO
     */
    Courier confirmOrders(OrdersConfirmDTO ordersConfirmDTO);
}
